﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using PerfilEmpreendedor.Dao.Interfaces;
using PerfilEmpreendedor.Dao.Factory;
using PerfilEmpreendedor.Bo.Model;
using Ext.Net;
using System.Collections;


namespace PerfilEmpreendedor.FrontEnd
{
    public partial class Default : PerfilEmpreendedorPage
    {
        private DaoFactory daoFactory = DaoFactory.GetInstance;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                ListarPartidas();
                CarregarRanking();
            }
        }
        protected void ListarPartidas()
        {
            IPartidaDao partidaDao = daoFactory.GetPartidaDao;
            storeDados.DataSource = partidaDao.ListarAbertas();
            storeDados.DataBind();

            storePartidasIniciadas.DataSource = partidaDao.ListarInscritas(IdUserLogado);
            storePartidasIniciadas.DataBind();
        }
        protected void CarregarRanking()
        {
            IUsuarioDao usuarioDao = daoFactory.GetUsuarioDao;
            storeRanking.DataSource = usuarioDao.ObterTop20();
            storeRanking.DataBind();
        }
        protected void Detalhar(Object sender, DirectEventArgs e)
        {
            IPartidaDao partidaDao = daoFactory.GetPartidaDao;
            Partida partida = partidaDao.Find(Convert.ToInt32(e.ExtraParams["Id"]));
            hiddenId.Text = partida.Id.ToString();
            lblDescricao.Text = partida.Descricao;
            lblNivel.Text = partida.Nivel.Descricao;
            lblTempo.Text = partida.TempoDeResposta.ToString() + " min.";
            lblIniciada.Text = (partida.Iniciada) ? "Sim" : "Não";
            ListarJogadoresParticipantes(partida);
        }
        protected void ListarJogadoresParticipantes(Partida P)
        {
            IPartidaDao partidaDao = daoFactory.GetPartidaDao;
            Partida partida = partidaDao.Find(P.Id);
            ArrayList lst = new ArrayList();
            foreach (var item in partida.Jogadores)
            {
                lst.Add(new object[] { item.Jogador.Id, item.Jogador.Login, item.Posicao });
            }
            storeJogadores.DataSource = lst;
            storeJogadores.DataBind();
            windowDetalhe.Show();
            Boolean inscrito = partida.Jogadores.Count(x => x.Jogador.Id == IdUserLogado) > 0;
            btnIngressar.Disabled = inscrito;
            btnCancelarParticipacao.Disabled = !inscrito;
            
        }
        protected void Participar(Object sender, DirectEventArgs e)
        {
            IPartidaDao partidaDao = daoFactory.GetPartidaDao;
            IUsuarioDao usuarioDao = daoFactory.GetUsuarioDao;
            Partida p = partidaDao.Find(Convert.ToInt32(hiddenId.Text));
            if (p.Jogadores.Count(x => x.Jogador.Id == IdUserLogado) > 0)
            {
                ExtFunctions.Alert("Você já está inscrito nesta partida.", MessageBox.Icon.ERROR);
            }
            else
            {
                if (p.Jogadores.Count == 4)
                {
                    ExtFunctions.Alert("Esta partida já possui a quantidade máxima de participantes.", MessageBox.Icon.ERROR);
                }
                p.Jogadores.Add(new PartidaUsuario()
                {
                    Jogador = usuarioDao.Find(IdUserLogado),
                    Posicao = 0
                });
                partidaDao.Update(p);
                ListarJogadoresParticipantes(p);
                ListarPartidas();
            }


        }
        protected void CancelarParticipacao(Object sender, DirectEventArgs e)
        {
            IPartidaDao partidaDao = daoFactory.GetPartidaDao;
            Partida partida = partidaDao.Find(Convert.ToInt32(hiddenId.Text));
            PartidaUsuario partidaUsuario = partida.Jogadores.First(x => x.Jogador.Id == IdUserLogado);
            if (!partida.Iniciada)
            {
                if (partidaUsuario != null)
                {
                    partida.Jogadores.Remove(partidaUsuario);
                    partidaDao.Update(partida);
                    ListarJogadoresParticipantes(partida);
                    ListarPartidas();
                }
            }
            else
            {
                ExtFunctions.Alert("Partida iniciada, não é possível cancelar a participação.", MessageBox.Icon.ERROR);
            }
        }
        protected void IrParaPartida(Object sender, DirectEventArgs e)
        {
            Response.Redirect("Jogar.aspx?id=" + e.ExtraParams["Id"]);
        }
    }
}